#include "Vector3FLOAT.h"

#include <math.h>

//constructor. Puts everything to 0.
Vector3FLOAT::Vector3FLOAT():_x(0), _y(0), _z(0), _w(1)
{
}

//Constructor. Puts everything to the value of f.
Vector3FLOAT::Vector3FLOAT(float f):_x(f), _y(f), _z(f), _w(1)
{
}

//Constructor. Set the value to x, y and z.
Vector3FLOAT::Vector3FLOAT(float x, float y, float z):_x(x), _y(y), _z(z), _w(1)
{
}

//Destructor.
Vector3FLOAT::~Vector3FLOAT(){}

//Get X
inline float Vector3FLOAT::getX() const
{
	return _x;
}

//Get Y
inline float Vector3FLOAT::getY() const
{
	return _y;
}

//Get Z
inline float Vector3FLOAT::getZ() const
{
	return _z;
}

//Get W
inline float Vector3FLOAT::getW() const
{
	return _w;
}

//Settor
inline void Vector3FLOAT::set(float x, float y, float z)
{
	_x = x;
	_y = y;
	_z = z;
}

//norme
inline float Vector3FLOAT::getNorme() const
{
	return sqrt(_x * _x + _y * _y + _z * _z);
}

void Vector3FLOATAdd(const Vector3FLOAT& v1, const Vector3FLOAT& v2, Vector3FLOAT& r)
{
	r.set(v1.getX() + v2.getX(), v1.getY() + v2.getY(), v1.getZ() + v2.getZ());
}

void Vector3FLOATSub(const Vector3FLOAT& v1, const Vector3FLOAT& v2, Vector3FLOAT& r)
{
	r.set(v1.getX() - v2.getX(), v1.getY() - v2.getY(), v1.getZ() - v2.getZ());
}

void Vector3FLOATMulF(const Vector3FLOAT& v1, float f, Vector3FLOAT& r)
{
	r.set(v1.getX() * f, v1.getY() * f, v1.getZ() * f);
}

void Vector3FLOATMul(const Vector3FLOAT& v1, const Vector3FLOAT& v2, Vector3FLOAT& r)
{
	r.set(v1.getX() * v2.getX(), v1.getY() * v2.getY(), v1.getZ() * v2.getZ());
}

//dot
float Vector3FLOATDot(const Vector3FLOAT& v1, const Vector3FLOAT& v2)
{
	Vector3FLOAT t;
	Vector3FLOATMul(v1, v2, t);

	return t.getX() + t.getY() + t.getZ();
}

//normalize
void Vector3FLOATNormalize(const Vector3FLOAT& v1, Vector3FLOAT& out)
{
	float n = v1.getNorme();
	Vector3FLOATMulF(v1, 1/n, out);
}

//cross
void Vector3FLOATCross(const Vector3FLOAT& v1, const Vector3FLOAT& v2, Vector3FLOAT& r)
{
	float x = v1.getY() * v2.getZ() - v1.getZ() * v2.getY();
	float y = v1.getZ() * v2.getX() - v1.getX() * v2.getZ();
	float z = v1.getX() * v2.getY() - v1.getY() * v2.getX();

	r.set(x, y, z);
}